#-*- coding: utf-8 -*-
"""
@author: Bruno Figueira 11234
@author: Luis Pereira 12784
@last updated: 25-11-2014
@obs: Modulo que envia dados para o Model e para a View de forma a fazer
atualizações do estado do projeto
"""

from readExcel import ExcelReader
from model.DBManager import DBManager
from PlotGraphics import *

class Controller():
    """
    Classe que define todas as operações necessárias para enviar
    dados ao Model e View
    """

    STAT_IPC = 1
    STAT_TAXA = 2
    STAT_REMUN_MIN = 3
    STAT_REMUN_MAX = 4
    STAT_EV = 5
    STAT_PIB = 6
    STAT_REND_NACIONAL = 7
    STAT_REND_DISPONIVEL = 8
    STAT_REMUN_ANUAIS = 9

    def __init__(self):
        """
        Construtor da classe Controller
        """
        self.excelReader = ExcelReader()
        self.dbmanager = DBManager()
    
    def populate_database_from_excel(self, path):
        """
        Chama a função necessária para inserir os valores
        na base de dados
        """
        self.excelReader.xlread_db(self.dbmanager, path)

    def use_plot_graphics(self, stat, startYear, endYear):
        """
        Função que recebe o gráfico a ser executado (stat) e o intervalo
        de anos definido

        Keyword arguments:
        stat -- numero que define qual a estatistica a ser apresentada
        startYear -- Ano inicial
        endYear -- Ano final
        """

        if stat == Controller.STAT_IPC:
            return self.__plot_ipc(startYear, endYear)
        elif stat == Controller.STAT_TAXA:
            return self.__plot_taxa(startYear, endYear)
        elif stat == Controller.STAT_REMUN_MIN:
            return self.__plot_remun_min(startYear, endYear)
        elif stat == Controller.STAT_REMUN_MAX:
            return self.__plot_remun_max(startYear, endYear)
        elif stat == Controller.STAT_EV:
            return self.__plot_evolucao(startYear, endYear)
        elif stat == Controller.STAT_PIB:
            return self.__plot_pib(startYear, endYear)
        elif stat == Controller.STAT_REND_NACIONAL:
            return self.__plot_rend_nac_bruto(startYear, endYear)
        elif stat == Controller.STAT_REND_DISPONIVEL:
            return self.__plot_rend_disp_bruto(startYear, endYear)
        else:
            return self.__plot_remun_anuais(startYear, endYear)

    def __plot_ipc(self, startYear, endYear):
        """
        Funcao que recebe o startYear e endYear de forma a mostrar a
        estatistica do IPC-Global

        Keyword arguments:
        startYear - Ano inicial
        endYear - Ano final
        """
        listx = []
        listy = []

        for value in self.dbmanager.get_data_filtered_by_years(startYear,
                                                               endYear):
            if value.ipc_global != 0:
                listx.append(value.ano)
                listy.append(value.ipc_global)

        if len(listx) > 0:
            plot_graph(listx, listy, 'anos', 'IPC-Global',
                       u'Variação dos Anos com o IPC-Global')
            show_graph()
            return 0
        else:
            return 1


    def __plot_taxa(self, startYear, endYear):
        """
        Funcao que recebe o startYear e endYear de forma a mostrar a
        estatistica da Taxa de Inflaccao

        Keyword arguments:
        startYear - Ano inicial
        endYear - Ano final
        """
        listx = []
        listy = []

        for value in self.dbmanager.get_data_filtered_by_years(startYear,
                                                               endYear):
            if value.taxa_de_inflacao != 0:
                listx.append(value.ano)
                listy.append(value.taxa_de_inflacao)

        if len(listx) > 0:
            plot_graph(listx, listy, 'anos', u'Taxa de Inflacção',
                       u'Variacão dos Anos com a Taxa de Inflacção')
            show_graph()
            return 0
        else:
            return 1

    def __plot_remun_min(self, startYear, endYear):
        """
        Funcao que recebe o startYear e endYear de forma a mostrar a
        estatistica das Remuneracoes Minimas

        Keyword arguments:
        startYear - Ano inicial
        endYear - Ano final
        """
        listx = []
        listy = []

        for value in self.dbmanager.get_data_filtered_by_years(startYear,
                                                               endYear):
            if value.remun_min_mensal != 0:
                listx.append(value.ano)
                listy.append(value.remun_min_mensal)

        if len(listx) > 0:
            plot_graph(listx, listy, 'anos',
                       u'Remuneração Mínima Mensal',
                       u'Variação dos Anos com a Remuneração Mínima Mensal')
            show_graph()
            return 0
        else:
            return 1

    def __plot_remun_max(self, startYear, endYear):
        """
        Funcao que recebe o startYear e endYear de forma a mostrar a
        estatistica das Remuneracoes Maximas

        Keyword arguments:
        startYear - Ano inicial
        endYear - Ano final
        """
        listx = []
        listy = []

        for value in self.dbmanager.get_data_filtered_by_years(startYear,
                                                               endYear):
            if value.remun_max_mensal != 0:
                listx.append(value.ano)
                listy.append(value.remun_max_mensal)

        if len(listx) > 0:
            plot_graph(listx, listy, 'anos',
                       u'Remuneração Máxima Mensal',
                       u'Variação dos Anos com o Remuneração Máxima Mensal')
            show_graph()
            return 0
        else:
            return 1

    def __plot_evolucao(self, startYear, endYear):
        """
        Funcao que recebe o startYear e endYear de forma a mostrar a
        estatistica da Evolucao das Remuneracoes maximas e minimas

        Keyword arguments:
        startYear - Ano inicial
        endYear - Ano final
        """
        listx = []
        listy = []
        listy2 = []

        for value in self.dbmanager.get_data_filtered_by_years(startYear,
                                                               endYear):
            if value.ipc_global != 0:
                listx.append(value.ano)
                listy.append(value.remun_min_mensal / value.ipc_global)
                listy2.append(value.remun_max_mensal / value.ipc_global)

        if len(listx) > 0:
            plot_graph(listx, listy, 'anos',
                       u'Evolução das Remunerações',
                       u'Variação dos Anos com o Evolução das Remunerações',
                       u'Evolução das Remunerações mínimas')
            plot_graph(listx, listy2, 'anos',
                       u'Evolução das Remunerações',
                       u'Variação dos Anos com o Evolução das Remunerações',
                       u'Evolução das Remunerações máximas')
            show_graph()
            return 0
        else:
            return 1

    def __plot_pib(self, startYear, endYear):
        """
        Funcao que recebe o startYear e endYear de forma a mostrar a
        estatistica do PIB Anual

        Keyword arguments:
        startYear - Ano inicial
        endYear - Ano final
        """
        listx = []
        listy = []

        for value in self.dbmanager.get_data_filtered_by_years(startYear,
                                                               endYear):
            if value.pib_anual != 0:
                listx.append(value.ano)
                listy.append(value.pib_anual)

        if len(listx) > 0:
            plot_graph(listx, listy, 'anos', 'PIB Anual',
                       u'Variação dos Anos com o PIB Anual')
            show_graph()
            return 0
        else:
            return 1

    def __plot_rend_nac_bruto(self, startYear, endYear):
        """
        Funcao que recebe o startYear e endYear de forma a mostrar a
        estatistica do Rendimento Nacional Bruto

        Keyword arguments:
        startYear - Ano inicial
        endYear - Ano final
        """
        listx = []
        listy = []

        for value in self.dbmanager.get_data_filtered_by_years(startYear,
                                                               endYear):
            if value.rendimento_nacional_bruto_anual != 0:
                listx.append(value.ano)
                listy.append(value.rendimento_nacional_bruto_anual)

        if len(listx) > 0:
            plot_graph(listx, listy, 'anos', 'Rendimento Nacional Bruto',
                       u'Variação dos Anos com o Rendimento Nacional Bruto')
            show_graph()
            return 0
        else:
            return 1

    def __plot_rend_disp_bruto(self, startYear, endYear):
        """
        Funcao que recebe o startYear e endYear de forma a mostrar a
        estatistica do Rendimento Disponivel Bruto

        Keyword arguments:
        startYear - Ano inicial
        endYear - Ano final
        """
        listx = []
        listy = []

        for value in self.dbmanager.get_data_filtered_by_years(startYear,
                                                               endYear):
            if value.rendimento_disponivel_bruto_anual != 0:
                listx.append(value.ano)
                listy.append(value.rendimento_disponivel_bruto_anual)

        if len(listx) > 0:
            plot_graph(listx, listy, 'anos',
                       u'Rendimento Disponível Bruto',
                       u'Variação dos Anos com o Rendimento Disponível Bruto')
            show_graph()
            return 0
        else:
            return 1

    def __plot_remun_anuais(self, startYear, endYear):
        """
        Funcao que recebe o startYear e endYear de forma a mostrar a
        estatistica das Remuneracoes Anuais

        Keyword arguments:
        startYear - Ano inicial
        endYear - Ano final
        """
        listx = []
        listy = []

        for value in self.dbmanager.get_data_filtered_by_years(startYear,
                                                               endYear):
            if value.remuneracoes_anual != 0:
                listx.append(value.ano)
                listy.append(value.remuneracoes_anual)

        if len(listx) > 0:
            plot_graph(listx, listy, 'anos', u'Remunerações Anuais',
                       u'Variação dos Anos com as Remunerações Anuais')
            show_graph()
            return 0
        else:
            return 1